package com.glodon.paas.util;

import java.security.MessageDigest;

public class TokenGenerator {
	private final static String[] md5Chars = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
	public static String generate(String str) {
		// 可以自定义生成MD5加密字符传前的混合KEY
		String key = "glodoncloud";
		// 要使用生成URL的字符
		String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h",
				"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
				"u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
				"6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
				"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
				"U", "V", "W", "X", "Y", "Z"

		};
		 
		// 对传入网址进行MD5加密
		String hex = encodeByMD5(key+str);

		String[] resUrl = new String[4];

		for (int i = 0; i < 4; i++) {
			// 把加密字符按照8位一组16进制与0x3FFFFFFF进行位与运算
			long hexint = Long.valueOf("3FFFFFFF", 16) & Long.valueOf( hex.substring(i * 8,(i+1)*8), 16); 
			String outChars ="";
			for (int j = 0; j < 6; j++) {
				// 把得到的值与0x0000003D进行位与运算，取得字符数组chars索引
				int index =  (int) (Long.valueOf("0000003D", 16) & hexint);
				// 把取得的字符相加
				outChars += chars[index];
				// 每次循环按位右移5位
				hexint = hexint >> 5;
			}
			// 把字符串存入对应索引的输出数组
			resUrl[i] = outChars;
		}

		return resUrl[0];

	}


    /**对字符串进行MD5编码*/ 
    private static String encodeByMD5(String originString){ 
        if (originString!=null) { 
            try { 
                //创建具有指定算法名称的信息摘要 
                MessageDigest md5 = MessageDigest.getInstance("MD5"); 
                //使用指定的字节数组对摘要进行最后更新，然后完成摘要计算 
                byte[] results = md5.digest(originString.getBytes()); 
                //将得到的字节数组变成字符串返回  
                String result = byteArrayToHexString(results); 
                return result; 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
        } 
        return null; 
    } 
 
    /** 
    * 轮换字节数组为十六进制字符串 
    * @param b 字节数组 
    * @return 十六进制字符串 
    */ 
    private static String byteArrayToHexString(byte[] b){ 
        StringBuffer resultSb = new StringBuffer(); 
        for(int i=0;i<b.length;i++){ 
            resultSb.append(byteToHexString(b[i])); 
        } 
        return resultSb.toString(); 
    } 
    private static String byteToHexString(byte b){ 
        int n = b; 
        if(n<0) 
        n=256+n; 
        int d1 = n/16; 
        int d2 = n%16; 
        return md5Chars[d1] + md5Chars[d2]; 
    } 
	public static void main(String[] args){
		System.out.println(TokenGenerator.generate(UUIDUtil.getUUIDStr()));;
	}
}
